#ifndef RTSPPUSHER_H
#define RTSPPUSHER_H

#include"mediabase.h"
#include"commonlooper.h"
#include"packetqueue.h"
extern "C"{
#include"libavformat/avformat.h"
#include"libavformat/avio.h"
#include"libavcodec/avcodec.h"
#include"libavutil/opt.h"
}


///
/// 发送推流的部分
/// \brief The RtspPusher class
///
class RtspPusher: public CommonLooper
{
public:
    RtspPusher();
    ~RtspPusher();
    RET_CODE init(const Properties properties);
    void deInit();
    // 向队列中push数据
    RET_CODE push(AVPacket *pkt, MediaType media_type);
    // 连接服务器，连接成功自动启动线程
    RET_CODE connect();
    // 配置视频流
    RET_CODE configVideoStream(const AVCodecContext *ctx);
    // 配置音频流
    RET_CODE configAudioStream(const AVCodecContext *ctx);
    virtual void loop();
    // 判断是否超时了
    bool isTimeout();
    // 重置记录超时的开始时间
    void resetTimeout();
    // 获取配置的超时时间
    int getTimeout();
    // 获取当前阻塞了多久，单位毫秒
    int64_t getBlockTime();
private:
    // 发送数据|推流数据
    int sendPacket(AVPacket *pkt, MediaType media_type);
    // 整个输出流的上下文
    AVFormatContext *_fmt_ctx = NULL; //_out_fmt_ctx
    AVCodecContext *_video_ctx = NULL;
    AVCodecContext *_audio_ctx = NULL;

    // 流
    AVStream *_video_stream = NULL;
    int _video_idx = -1;
    AVStream *_audio_stream = NULL;
    int _audio_idx = -1;

    // 推流地址
    std::string _url = "";
    // 传输方式，udp；tcp
    std::string _rtsp_transport = "";

    double _audio_frame_duration = 23.21995649;
    double _video_frame_duration = 40;
    PacketQueue *_queue = NULL;

    // 配置的超时时长
    int _timeout = 0;
    // 记录调用ffmpeg的api前一刻的时间戳
    int _pre_time = 0;
};

#endif // RTSPPUSHER_H
